# MusicPlayer.gd
extends Node2D

# 使用 @onready 获取 AudioPlayer 节点
@onready var audio_player = $AudioPlayer
# 播放列表：将你的 AudioStream 文件拖拽到 Inspector 面板的这个数组中
@export var playlist: Array[AudioStream] = []
# 获取播放滚动列表
@onready var song_list_container = $SongListUI/Panel/ScrollContainer/GridContainer
@onready var btn_close = $Btn_Close
# 跟踪当前播放歌曲在列表中的索引
var current_track_index = 0
var is_track_paused = false
signal close_requested

func _ready():
	# 🌟 修正点 1: 添加 _ready 函数作为启动点
	setup_song_buttons()
	
	#切换CD机
	# 确保按钮的 pressed() 信号已连接到 _on_next_button_pressed 函数！
	
	# 1. 初始化列表：获取 CanvasLayer 的所有子节点（即所有的 TextureRect）
	texture_rects = canvas_layer.get_children()
	
	# 2. 确保所有 Rect 节点初始都是隐藏的 (以防万一)
	for rect in texture_rects:
		if rect is TextureRect:
			rect.visible = false
	
	# 3. 立即显示第一个 TextureRect
	if texture_rects.size() > 0:
		current_rect_index = 0
		texture_rects[current_rect_index].visible = true
		print("已显示第一个 TextureRect。")
		
	btn_close.pressed.connect(_on_close_pressed)



# 🌟 核心新函数 2: 初始化列表按钮，分配索引并连接信号
func setup_song_buttons():
	if song_list_container == null:
		push_error("错误: 无法找到 SongListContainer 节点。请检查路径是否正确。")
		return

	var song_buttons = song_list_container.get_children()
	var i = 0
	
	if song_buttons.size() != playlist.size():
		push_warning("警告: 按钮数量 (%d) 与播放列表歌曲数量 (%d) 不匹配。" % [song_buttons.size(), playlist.size()])
	
	for button in song_buttons:
		if button is Button: 
			
			if i < playlist.size():
				# 设置按钮文本为歌曲文件名 (去掉路径)
				button.text = playlist[i].resource_path.get_file().get_basename()
			else:
				button.text = "歌曲缺失"
			
			button.set_meta("song_index", i) 
			
			# 🌟 修正点 3A: 动态连接信号，并使用 .bind() 传递按钮自身
			if not button.is_connected("pressed", Callable(self, "_on_song_button_pressed")):
				button.connect("pressed", Callable(self, "_on_song_button_pressed").bind(button))
			
			i += 1


# 🌟 核心新函数 3: 统一处理歌曲按钮点击的函数
# 🌟 修正点 3B: 函数签名接收传递进来的按钮对象
func _on_song_button_pressed(button_node: Button):
	var pressed_button = button_node
	
	if pressed_button and pressed_button.has_meta("song_index"):
		var index_to_play = pressed_button.get_meta("song_index") 
		play_track(index_to_play)
		print("从列表播放: 索引 ", index_to_play)
	else:
		print("警告：点击事件未成功定位到带索引的按钮。")


# 核心函数：加载并播放指定索引的歌曲
func play_track(index: int):
	print("a")
	if playlist.size() == 0:
		print("播放列表为空，无法播放！")
		return
	else:
		print("检测到歌曲列表")

	var list_size = playlist.size()
	current_track_index = index % list_size
	
	if current_track_index < 0:
		current_track_index += list_size
	
	audio_player.stream = playlist[current_track_index]
	
	# 确保新歌播放时取消暂停
	audio_player.set_stream_paused(false)
	is_track_paused = false
	
	audio_player.play()
	
	print("开始播放第 %d 首歌曲: %s" % [current_track_index + 1, playlist[current_track_index].resource_path.get_file()])


# Godot 在歌曲播放完毕时会自动调用此函数
func _on_audio_player_finished():
	print("当前歌曲播放完毕，自动切换下一首...")
	
	var next_index = current_track_index + 1
	play_track(next_index)


# 1. 播放按钮
func _on_play_button_pressed():
	if audio_player.stream == null and playlist.size() > 0:
		play_track(0)
	elif is_track_paused: 
		audio_player.set_stream_paused(false)
		is_track_paused = false 
		print("音乐继续播放")
	elif audio_player.stream != null and not audio_player.is_playing():
		audio_player.play()
		print("音乐开始播放")
		
# 2. 暂停按钮
func _on_pause_button_pressed():
	if audio_player.is_playing() and not is_track_paused:
		audio_player.set_stream_paused(true)
		is_track_paused = true
		print("音乐暂停")

# 3. 重新播放当前音乐按钮
func _on_replay_button_pressed():
	print("b")
	if audio_player.stream != null:
		audio_player.seek(0)
		# 🌟 修正点 2: 确保重播时重置暂停状态
		audio_player.set_stream_paused(false)
		is_track_paused = false
		audio_player.play()

# 4. 从列表第一首歌开始播放按钮
func _on_start_over_button_pressed():
	if playlist.size() > 0:
		play_track(0)

# 5. 下一首歌按钮
func _on_next_button_pressed():
	var next_index = current_track_index + 1
	play_track(next_index)

# 6. 上一首歌按钮
func _on_previous_button_pressed():
	var prev_index = current_track_index - 1
	play_track(prev_index)






#切换cd机
# 使用 @onready 确保获取到 CanvasLayer 节点
@onready var canvas_layer = $CanvasLayer

# 追踪当前显示的 TextureRect 的索引，-1 表示没有显示任何 Rect
var current_rect_index = -1

# 存储所有 TextureRect 节点的数组
var texture_rects = []

# --- 按钮点击处理函数 ---

func _on_nextCD_button_pressed():
	# 确保播放列表不为空
	if texture_rects.size() == 0:
		print("TextureRect 列表为空，无法切换。")
		return

	# 1. 隐藏当前的 TextureRect
	if current_rect_index >= 0:
		texture_rects[current_rect_index].visible = false
	
	# 2. 计算下一个索引
	# 使用取模运算 (%) 实现循环切换：当到达最后一个时，返回到第一个 (0)
	var next_index = (current_rect_index + 1) % texture_rects.size()
	
	# 3. 更新索引
	current_rect_index = next_index
	
	# 4. 显示下一个 TextureRect
	texture_rects[current_rect_index].visible = true
	
	print("切换到索引: ", current_rect_index)

func _on_close_pressed():
	print("返回主菜单...")
	
	if has_node("AudioPlayer"):
		$AudioPlayer.stop()

	get_tree().change_scene_to_file("res://scene/MainMenu.tscn")
